#include<iostream>
#include<cstring>
using namespace std;
int t, n;
string s;
// dp[p] = 1表示可以达到该状态，-1表示不可达，0表示未计算
int dp[1 << 18];

// 检查当前状态是否安全
bool check(int p) 
{
    // 状态从1开始，字符串索引从0开始
    return p == 0 || s[p - 1] == '0';
}

// 记忆化搜索，判断是否可以达到目标状态
int solve(int p) 
{
    // 如果已经计算过这个状态，直接返回结果
    if (dp[p] != 0) return dp[p];    
    // 如果当前状态不安全，则不可达
    if (!check(p)) 
    {
        dp[p] = -1;
        return -1;
    }    
    // 如果是初始状态（空瓶），可以达到
    if (p == 0) 
    {
        dp[p] = 1;
        return 1;
    }    
    // 尝试从每个可能的前一状态转移过来
    for (int i = 0; i < n; i++) 
    {
        // 如果当前状态包含化学物质i+1
        if (p & (1 << i)) 
        {
            // 移除这个化学物质，得到前一状态
            int pre = p & ~(1 << i);
            // 如果前一状态可达，则当前状态也可达
            if (solve(pre) == 1) 
            {
                dp[p] = 1;
                return 1;
            }
        }
    }    
    // 如果所有可能的前一状态都不可达，则当前状态不可达
    dp[p] = -1;
    return -1;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    cin >> t;
    while (t--) 
    {
        cin >> n >> s;
        
        // 初始化dp数组
        fill(dp, dp + (1 << n), 0);
        
        // 计算目标状态（所有化学物质混合）是否可达
        int end = (1 << n) - 1;
        
        // 输出结果
        if (solve(end) == 1) 
        {
            cout << "Yes" << endl;
        } 
        else 
        {
            cout << "No" << endl;
        }
    }
    return 0;
}